package com.weme.live.ext

import android.content.Context
import android.util.Log
import android.view.inputmethod.InputMethodManager
import com.google.gson.Gson
import com.weme.chat.bean.GiftMessage
import com.weme.common.util.showToast
import com.weme.live.activity.LiveRoomActivity
import com.weme.live.activity.liveview.Message
import io.agora.CallBack
import io.agora.ChatRoomChangeListener
import io.agora.MessageListener
import io.agora.ValueCallBack
import io.agora.chat.*
import io.agora.chat.ChatMessage.ChatType


var chatRoomId = ""

class LiveChatExt {}

fun LiveRoomActivity.initChat() { //   val chatRoom: ChatRoom = ChatClient.getInstance().chatroomManager().createChatRoom(subject, description, welcomMessage, maxUserCount, members)

}

fun LiveRoomActivity.sendChatMsg(msg: String) {
    if(chatRoomId.equals("")){
        showToast("roomid 异常")
        return
    }
    // 创建一条文本消息，`content` 为消息文字内容，`conversationId` 为会话 ID，在单聊时为对端用户 ID、群聊时为群组 ID，聊天室时为聊天室 ID。
    val message = ChatMessage.createTextSendMessage(msg, chatRoomId)
    // 设置聊天类型为群聊。默认为单聊 `Chat`，也可以设置为聊天室 `ChatRoom`。 // 设置聊天类型为群聊。默认为单聊 `Chat`，也可以设置为聊天室 `ChatRoom`。
    message.chatType = ChatType.ChatRoom // 发送消息时可以设置 `CallBack` 的实例来获得消息发送的状态。可以在该回调中更新消息的显示状态，例如消息发送失败后的提示等。
    message.setMessageStatusCallback(object : CallBack {
        override fun onSuccess() { //showToast("发送消息成功");

            val inputMethodManager = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
            inputMethodManager.hideSoftInputFromWindow(getViewBinding().calView.windowToken, 0)
        }

        override fun onError(code: Int, error: String) { //showToast("发送消息失败");
            Log.e("chat",error+"code="+code)
        }
    }) //发送消息。
    //发送消息。
    ChatClient.getInstance().chatManager().sendMessage(message)
}




fun  LiveRoomActivity.addFollow(){
    //   ChatClient.getInstance().contactManager().addContact(getViewModel().anchorId.toString(), "follow")
    val cmdMsg = ChatMessage.createSendMessage(ChatMessage.Type.CMD) // 设置聊天类型为单聊、群聊或聊天室。
    // 设置聊天类型为单聊、群聊或聊天室。
    cmdMsg.chatType = ChatType.GroupChat
    val action = "follow" // 可自定义 action。
    // 可自定义 action。
    val cmdBody = CmdMessageBody(action) // 设置透传消息的接收方的用户 ID（群聊或聊天室分别为群组 ID 或聊天室 ID）。
    // 设置透传消息的接收方的用户 ID（群聊或聊天室分别为群组 ID 或聊天室 ID）。
    cmdMsg.to = chatRoomId
    cmdMsg.addBody(cmdBody)
    ChatClient.getInstance().chatManager().sendMessage(cmdMsg)
}
//加入聊天室
fun LiveRoomActivity.addChat() { //  val chatRooms: PageResult<ChatRoom> = ChatClient.getInstance().chatroomManager().fetchPublicChatRoomsFromServer(1, 100)

    // 加入聊天室。
    ChatClient.getInstance().chatroomManager().joinChatRoom(chatRoomId, object : ValueCallBack<ChatRoom?> {
        override fun onSuccess(value: ChatRoom?) {
            Log.e("tag","加入房间成功")
        }
        override fun onError(error: Int, errorMsg: String) {
            Log.e("tag","code= "+error  +"msg="+errorMsg)
        }
    })
    ChatClient.getInstance().chatroomManager().addChatRoomChangeListener(chatRoomChangeListener)
    ChatClient.getInstance().chatManager().addMessageListener(msgListener)
}

//退出聊天室
fun LiveRoomActivity.outRoomChat() {
    ChatClient.getInstance().chatroomManager().leaveChatRoom(chatRoomId)
    ChatClient.getInstance().chatManager().removeMessageListener(msgListener)
}


fun LiveRoomActivity.chatRoomListener() { // 移除聊天室监听
    ChatClient.getInstance().chatroomManager().removeChatRoomListener(chatRoomChangeListener)
}

var LiveRoomActivity.msgListener: MessageListener
    get() = MessageListener {
        it.forEachIndexed { index, chatMessage ->
            if(chatMessage.chatType!=ChatType.ChatRoom){
                return@forEachIndexed
            }
            if(chatMessage.type == ChatMessage.Type.TXT){
                getViewModel().anchorUser?.apply {
                    val msg = (chatMessage.body as TextMessageBody).message.toString()
                    Log.e("live","msgListener"+headPic.toString())
                    getViewModel().addMsgContentLiveData.postValue(Message(avatarUrl = headPic, nickname = nickname,  msg, false))
                    TranslationManager.addToQueue(msg)
                    getViewModel().setTranslate(msg)

                }
            }else if(chatMessage.type == ChatMessage.Type.CUSTOM){
                getViewModel().anchorUser?.apply {
                    val params = (chatMessage.body as CustomMessageBody).params
                    val jsonString = Gson().toJson(params)

                    getViewModel().addMsgContentLiveData.postValue(Message(avatarUrl = headPic, nickname = nickname, jsonString, false, type = 2))
                }

            }



        }
    }
    set(value) {

    }
object TranslationManager {
    private val queue: MutableList<String> = mutableListOf()

    fun addToQueue(content: String) {
        queue.add(content)
    }

    fun getAllItems(): List<String> {
        return queue
    }

    fun removeFirstItem() {
        if (queue.isNotEmpty()) {
            queue.removeAt(0)
        }
    }

    fun translateContent(content: String) {
        // Execute translation operation
        println("Translating content: $content")
    }

    // User clicks on the first item in the queue for translation
    fun translateFirstItem(): String {
        if (queue.isNotEmpty()) {
            val content = queue.removeAt(0)
            translateContent(content)
            return content
        } else {
            println("No content available for translation")
        }
        return ""
    }
}

//private val LiveRoomActivity.messageListener: MessageListener
//    get() = object : MessageListener {
//        override fun onMessageReceived(messages: List<ChatMessage>) {
//            Log.e("chatRoom","onMessageReceived")
//            messages.forEach {
//                getViewModel().anchorUser?.apply {
//                    getViewModel().addMsgContentLiveData.postValue(Message(avatarUrl = headPic, nickname = nickname, (it.body as TextMessageBody).message.toString(), false))
//                }
//            }
//        }
//
//        override fun onCmdMessageReceived(messages: List<ChatMessage>) {
//            messages.filterIsInstance<CmdMessageBody>().forEach { chatMessage ->
//                val action = chatMessage.action()
//                if (action.equals("start")) {
//                    getViewModel().startTimer()
//                }
//            }
//        }
//
//    }


var chatRoomChangeListener = object : ChatRoomChangeListener {
    // 聊天室被解散。聊天室的所有成员会收到该事件。
    override fun onChatRoomDestroyed(roomId: String?, roomName: String?) {

    }

    // 有用户加入聊天室。聊天室的所有成员（除新成员外）会收到该事件。
    override fun onMemberJoined(roomId: String?, participant: String?) {

    }

    // 有成员主动退出聊天室。聊天室的所有成员（除退出成员外）会收到该事件。
    override fun onMemberExited(roomId: String?, roomName: String?, participant: String?) {

    }

    // 有成员被踢出聊天室。被踢出聊天室的成员会收到该事件。
    override fun onRemovedFromChatRoom(reason: Int, roomId: String?, roomName: String?, participant: String?) {

    }

    // 有成员被加入禁言列表。聊天室所有者、管理员和被禁言的成员会收到该事件。
    override fun onMuteListAdded(chatRoomId: String?, mutes: MutableList<String>?, expireTime: Long) {

    }

    // 有成员被移出禁言列表。聊天室所有者、管理员和被解除禁言的成员会收到该事件。
    override fun onMuteListRemoved(chatRoomId: String?, mutes: MutableList<String>?) {

    }

    // 有成员被加入白名单列表。被添加的成员及聊天室所有者和管理员（除操作者外）会收到该事件。
    override fun onWhiteListAdded(chatRoomId: String?, whitelist: MutableList<String>?) {

    }

    // 有成员被移出白名单列表。被移出的成员及聊天室所有者和管理员（除操作者外）会收到该事件。
    override fun onWhiteListRemoved(chatRoomId: String?, whitelist: MutableList<String>?) {

    }

    // 全员禁言状态变更。聊天室所有者、管理员和禁言状态变更的成员会收到该事件。
    override fun onAllMemberMuteStateChanged(chatRoomId: String?, isMuted: Boolean) {

    }

    // 有成员被设为管理员。新管理员、聊天室所有者和其他管理员会收到该事件。
    override fun onAdminAdded(chatRoomId: String?, admin: String?) {

    }

    // 有成员被移除管理员权限。被移除管理权限的管理员、聊天室所有者和其他管理员会收到该事件。
    override fun onAdminRemoved(chatRoomId: String?, admin: String?) {

    }

    // 聊天室所有者变更。聊天室的所有成员会收到该事件。
    override fun onOwnerChanged(chatRoomId: String?, newOwner: String?, oldOwner: String?) {

    }

    // 聊天室公告变更。聊天室的所有成员（除操作者）会收到该事件。
    override fun onAnnouncementChanged(chatRoomId: String?, announcement: String?) {

    }


}